<?php

// 商品类
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Session;
use App\Http\Controllers\CategoryController as Category;

class SkuController extends Controller
{
	
	// 3D旋转
	public function d3()
	{
		return view('sku.3d');
	}
	
	
	// sku列表
	public function index( Request $request )
	{
	
		// 获取路由
		$route_array = request()->route()->getAction();
		$controller = explode("\\",$route_array['controller']);
		$result = explode("@",$controller[3]);
		// 控制器 	$result[0];
		// 方法 	$result[1];
		$auth_final = '';
		foreach( Session::get('auths') as $key=> $auth_info )
		{
			// 符合条件
			if( $auth_info['controller']==$result[0] && $auth_info['func']==$result[1] )
			{
				$auth_final = true;
				break;
			}else
			{
				$auth_final = false;
			}
		} 
		// 权限验证失败
		if( !$auth_final )
		{
			return back()->with( ['authinfo'=>'没有此项权限'] );
		}
		
		// 获取 搜索关键字
		$keyword = $request->input('keyword',"");
		if( empty($keyword) )
		{
			// 为空 说明没有搜索
			$one = 's.id';
			$two = '!=';
			$three = '0';
		}else
		{
			// sku名称 
			$one = 's.name';
			$two = 'like';
			$three = '%'.$keyword.'%';
		}
		
		// 查询所有sku 每页20条数据
		$skus = DB::table('sku as s') 
				-> select('s.id','s.name','s.category_id','s.status','s.admin_id','c.name as category_name','a.name as adminName',DB::raw("case when s.status=1 then '上架' when s.status=2 then '热卖' when s.status=3 then '新品' when s.status=4 then '已下架' when s.status=5 then '无库存' end as skuStatus"),DB::raw("replace(sp.pic_url,'/image','".config('app.imgPath')."/image' ) as pic_url "),'s.create_at','s.price','s.vip','s.is_sold_out' )
				-> leftJoin('sku_pic as sp','sp.sku','=','s.id')
				-> leftJoin('category as c','c.id','=','s.category_id')
				-> leftJoin('admin as a','a.id','=','s.admin_id')
				-> where( $one,$two,$three ) 
				// 只要封面
				-> where( 'sp.type','=','1' ) 
				-> orderBy('s.id','desc')
				-> paginate(20);
		return view( 'sku.list',[ 'skus'=>$skus,'request'=>$keyword ] );
	
	}


	// 商品创建 编辑页面
	public function add( $sku='' )
	{
	
		// 获取路由
		$route_array = request()->route()->getAction();
		$controller = explode("\\",$route_array['controller']);
		$result = explode("@",$controller[3]);
		// 控制器 	$result[0];
		// 方法 	$result[1];
		$auth_final = '';
		foreach( Session::get('auths') as $key=> $auth_info )
		{
			// 符合条件
			if( $auth_info['controller']==$result[0] && $auth_info['func']==$result[1] )
			{
				$auth_final = true;
				break;
			}else
			{
				$auth_final = false;
			}
		} 
		// 权限验证失败
		if( !$auth_final )
		{
			return back()->with( ['authinfo'=>'没有此项权限'] );
		}
	
		// 获取所有一级分类
		$all_first_category = Category::getFirstAll();
		
		if( $sku )
		{
			// 主表 所有内容
			$sku_info = $this::get_sku_by_id( $sku );
			// 线上
			$sku_info->content = str_replace( "/image" ,config('app.imgPath')."/image",$sku_info->content);
			// 商品分类内容
			$category_path = $this::get_category_path( $sku_info->category_id );
			
			// 获取商品标签
			$tags_info = DB::table('tag_record as tr')
								-> select('t.name')
								-> leftJoin( 'tag as t','t.id','=','tr.tag_id' )
								// 商品
								-> where('tr.type',1)
								-> where('tr.record_id', $sku)
								-> get();
			$tag_str = '';
			foreach( $tags_info as $key => $tag_name )
			{
				$tag_str .= $tag_name->name.',';
			}
			// 标签 字符串
			$tag_str = rtrim($tag_str,',');
			
			// 编辑页面
			return view("sku.add",['all_first_category'=>$all_first_category,'sku_info'=>$sku_info,'category_path'=>$category_path,'tag_str'=>$tag_str ] );
			
		}else
		{
			// 创建页面
			return view("sku.add",['all_first_category'=>$all_first_category]);
		}
		
	}
	
	
	// 执行 商品 创建 编辑
    public function doAdd( Request $request )
    {
		// 接收数据
		$data = $request -> only('category','name','tags','price','vip','content','sku');
		
		// 验证内容 
		// 清除无效值
		unset($data['category'][0]);
		// 包含 -1 
		if( in_array( '-1',$data['category'] ) )
		{
			$this -> ajAxReturn( '请将分类选择完整' );
		}
		// 选择完整之后
		// $data['category_id'] = $data['category'][count($data['category'])];
		foreach( $data['category'] as $key => $category_id )
		{
			// 最后一次为 父类id
			$data['category_id'] = $category_id;
		}
		unset( $data['category'] );
		
		
		$title_length=mb_strlen( $data['name'],'utf-8' );
		if( $title_length<1 )
		{
			$this->ajAxReturn('请输入标题');
		}
		
		if( empty($data['tags']) )
		{
			$this->ajAxReturn( '请输入标签' );
		}
		
		if( empty($data['price'])  )
		{
			$this->ajAxReturn( '请输入标价' );
		}
		if( empty($data['vip'])  )
		{
			$this->ajAxReturn( '请输入vip会员价格' );
		}
		
		// 中文 ， 替换 英文 ,
		$data['tags'] = str_replace("，",",",$data['tags']);
		// 页面传来的标签内容
		$input_tag_arr = explode( ',',$data['tags'] );
		unset($data['tags']);
		// 用于数据表插入 关联 商品 和 标签
		$sku_tag = array();
		foreach( $input_tag_arr as $key => $tag )
		{
			// 检测标签库 是否已存在
			$history = DB::table('tag')
					-> where('name',$tag)
					-> first();
			
			if( empty($history) )
			{
				// 不存在
				// 执行插入 并获取标签id
				$sku_tag[$key] = DB::table('tag')->insertGetId( ['name'=>$tag] );
			}else
			{
				// 已存在
				// 获取现有的标签id
				$sku_tag[$key] = $history->id;
			}
		}
		
		if( empty($data['content']) )
		{
			$this->ajAxReturn( '请至少输入一段商品描述 并 上传一张商品相关图片 ' );
		}
		
		// 正则 匹配图片地址
		$img_pattern="/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/";
		// 检查百度编辑器里的配置图片显示地址 与 app.imgPath 是否一致 必须一致
		// 线上
		$data['content'] = str_replace( config('app.imgPath'),'',$data['content'] );
		preg_match_all( $img_pattern,$data['content'],$pics );
		$sku_pics = $pics[1];
		if( count($sku_pics) < 1 )
		{
			$this->ajAxReturn('请上传至少一张商品相关图片');
		}
		
		// 商品第一段文字描述 不可和图片在同一段落里
		$desc_pattern = "/<p[^>]*>(?:(?!<\/p>)[\s\S])*<\/p>/i";
		preg_match_all( $desc_pattern,$data['content'],$desc_arr );
		foreach( $desc_arr[0] as $key => $str )
		{
			// 找到 img 标签 跳过
			if( strstr($str,'img') )
			{
				continue;
			}else
			{
				// 2段文字得紧挨着
				// 简短描述
				$str = str_replace('&nbsp;','',$str);
				$data['desc'] =  rtrim( ltrim( $str,"<p>" ),"<br/></p>" ) ;
				// 下一段是不是文字
				if( isset( $desc_arr[0][$key+1] ) )
				{
					$desc2 = $desc_arr[0][$key+1];
					// 不是文字
					if( strstr($desc2,'img') )
					{
						$this->ajAxReturn('请输入第二段描述');
					}
					$desc2 = str_replace('&nbsp;','',$desc2);
					$data['desc2'] =  rtrim( ltrim( $desc2,"<p>" ),"<br/></p>" ) ;
				}
				break;
			}
		}
		if( !isset($data['desc']) || empty($data['desc']) )
		{
			$this->ajAxReturn('请至少输入一段商品描述 不可与图片同一段落');
		}
		if( mb_strlen($data['desc'])<35 )
		{
			// $this->ajAxReturn('商品描述至少35个字');
		}
		if( empty($data['sku']) )
		{
			// 创建
			$data['admin_id'] = Session::get('admin_id');
			$data['create_at']= date('Y-m-d H:i:s',time());
			unset( $data['sku'] );
			
			// 商品 主表
			$sku = DB::table('sku')->insertGetId( $data );
			if( !$sku )
			{
				$this->ajAxReturn( '添加商品主表失败' );
			}
			
			// 关联 商品 标签
			foreach( $sku_tag as $key => $tag_id )
			{
				$tag_record_arr = array();
				// 1 商品 
				$tag_record_arr['type'] = 1;
				$tag_record_arr['tag_id'] = $tag_id;
				$tag_record_arr['record_id'] = $sku;
				// 标签 关联表
				DB::table('tag_record')->insertGetId( $tag_record_arr );
			
			}
			
			// 遍历 图片 地址信息
			foreach( $sku_pics as $key => $file_path )
			{
				
				$pic = array();
				if($key==0)
				{
					// 封面
					$pic['type'] = 1;
				}
				$pic['sku'] = $sku;
				$pic['pic_url'] = $file_path;
				// 商品图片表
				DB::table('sku_pic')->insertGetId( $pic );
			
			}
			
			
			$log = array(
				'sku'=>$sku,
				'desc'=>' 添加 sku=>'.$sku.' &nbsp;标题=>'.$data['name']." &nbsp;售价=>".$data['price']." &nbsp;vip=>".$data['vip'],
				'admin_id'=>Session::get('admin_id'),
				'log_at'=>date( 'Y-m-d H:i:s',time() ),
			);
			// 日志
			DB::table('sku_log')->insertGetId( $log );
			
			$this->ajAxReturn( '添加商品成功' );
			
		}else
		{
			$sku = $data['sku'];
			
			// 编辑 
			// 获取 现有 图片地址
			$old = DB::table('sku_pic')
					-> where( 'sku','=',$sku )
					-> get();
					
			$old_pics = array();
			foreach( $old as $key => $pic_info )
			{
				// 转成数组
				$old_pics[ $pic_info->id ] = $pic_info->pic_url;
			}
			
			// 获取差集 结果为要删除的图片
			$del = array_diff($old_pics,$sku_pics);
			if( count($del)>0 )
			{
				foreach( $del as $pic_id => $pic_info )
				{
					// 线上
					$file = '../..'.$pic_info;
					if( file_exists($file) )
					{
						// 删除 文件
						unlink( $file );	
					}
					// 删除 图片表旧数据
					$delete = DB::table('sku_pic')
								-> where( 'id','=',$pic_id )
								-> delete();
					
				}
			}
			
			// 获取差集 为新增图片
			$new = array_diff( $sku_pics,$old_pics );
			
			foreach( $new as $key => $file_path )
			{
				$pic = array();
				if($key==0)
				{
					// 封面
					$pic['type'] = 1;
				}
				$pic['sku'] = $sku;
				$pic['pic_url'] = $file_path;
				// 图片表
				DB::table('sku_pic')->insertGetId( $pic );
				
			}
			
			// 获取现有的标签
			$old_tags = DB::table('tag_record as tr')
					// 标签 id
					-> select('t.id as tag_id','tr.id as trid')
					-> leftJoin('tag as t','t.id','=','tr.tag_id')
					-> where( 'tr.record_id','=',$sku )
					// 商品
					-> where( 'tr.type','=',1 )
					-> get();
			$old_tag = array();
			foreach( $old_tags as $key => $tag_info )
			{
				$old_tag[$tag_info->trid] = $tag_info->tag_id;
			}
			// 要删的标签
			$tagDel = array_diff( $old_tag,$sku_tag );
			// 要添加的标签
			$tagAdd = array_diff( $sku_tag,$old_tag );
			
			if( count($tagDel)>0 )
			{
				foreach( $tagDel as $trId => $tag_id )
				{
					// 执行删除记录
					DB::table('tag_record')
						-> where( 'id','=',$trId )
						-> delete();
				}
			}
			
			if( count($tagAdd)>0 )
			{
				foreach( $tagAdd as $key=> $tag_id )
				{
					$tag_record_edit_arr = array();
					// 商品
					$tag_record_edit_arr['type'] = 1;
					$tag_record_edit_arr['tag_id'] = $tag_id;
					$tag_record_edit_arr['record_id'] = $sku;
					DB::table('tag_record')->insertGetId( $tag_record_edit_arr );
				}
			}
			
			
			unset( $data['sku'] );
			$upd_res = DB::table('sku')
							-> where( 'id','=',$sku )
							-> update( $data );
							
			if( $upd_res )
			{
				$log = array(
					'sku'=>$sku,
					'desc'=>' 修改 sku=>'.$sku.' &nbsp;标题=>'.$data['name']." &nbsp;售价=>".$data['price']." &nbsp;vip=>".$data['vip'],
					'admin_id'=>Session::get('admin_id'),
					'log_at'=>date( 'Y-m-d H:i:s',time() ),
				);			
				// 日志
				DB::table('sku_log')->insertGetId( $log );
			}
			
			
			$this -> ajAxReturn( '商品编辑成功' );
		}
		
    }   
	
	
	// 目的：获取商品的所有分类层级
	// 参数：分类id
	// 返回：数组
	public static function get_category_path( $category_id='' )
	{
		// 分类信息
		$category_info = DB::table('category')
					-> where( 'id','=',$category_id )
					-> first();
		// 拼一个完整的path
		$category_info->path .= $category_id;
		// 转换成数组
		$category_arr = explode( '-',$category_info->path );
		// 清除无效值
		unset( $category_arr[0] );	
		$arr = array();
		foreach( $category_arr as $key=>$category_id )
		{
			$category_info = DB::table('category')->where( 'id','=',$category_id )->first();
			// 分类的 id 与 分类名
			$arr[$key]['category_name'] = $category_info->name;
			$arr[$key]['id'] = $category_info->id;
		}
		return $arr;
	}
	
	
	// 目的：获取 商品信息
	// 参数：商品id 
	// 返回：对象
    public static function get_sku_by_id( $sku_id )
	{
		// sku 信息
		$sku_info = DB::table('sku as s')
				-> where( 's.id','=',$sku_id )
				-> first();
		return $sku_info;
	}
	
	
	// 批量 删除商品
	public function delSkuAll( Request $request )
	{
		$data = $request -> only('all');
		// 清除无效值
		unset($data['all'][0]);	
		foreach( $data['all'] as $sku )
		{
			// 获取 现有的 图片地址
			$old_pics = DB::table('sku_pic')
							-> where( 'sku','=',$sku )
							-> get();
			foreach( $old_pics as $pic_id => $pic_info )
			{
				// 线上
				$file = "../..".$pic_info->pic_url;
				if( file_exists($file) )
				{
					// 删除 文件
					unlink( $file );	
				}
			}
		}
		
		// 删除表数据
		
		// 图片表
		$one = DB::table('sku_pic')
			-> whereIn( 'sku',$data['all'] )
			-> delete();
			
		// 标签关联表
		$two = DB::table('tag_record')
			// 商品
			-> where('type',1)
			-> whereIn( 'record_id',$data['all'] )
			-> delete();
			
		// 详情表
		$three = DB::table('sku')
			-> whereIn( 'id',$data['all'] )
			-> delete();
		
		if( $one && $two && $three )
		{
			$this -> ajAxReturn('删除成功');
		}
		
		$this -> ajAxReturn('删除失败');
	}
	
	
	// 获取 商品的操作 记录
	public function getSkuLog( Request $request )
	{	
		$data = $request -> except('_token');
		if( !isset($data['sku']) )
		{
			exit('缺少商品id');
		}
		$logs = DB::table('sku_log as sl')
				// 操作时间 操作说明 操作者 商品名称
				-> select('sl.log_at','sl.desc','a.name as adminName','s.name as skuName')
				-> leftJoin('admin as a','a.id','=','sl.admin_id')
				-> leftJoin('sku as s','s.id','=','sl.sku')
				-> where( 'sl.sku',$data['sku'] )
				-> orderBy('sl.log_at','desc')
				-> get();
		
		$html = "";
		foreach( $logs as $info )
		{
			$html .= "<div  style='height:70px;width:100%;display:block;float:left;'>";
			$html .= "	<h3 class='popover-title'>".$info->log_at."</h3>";
			$html .= "	<div class='popover-content'>".$info->adminName.$info->desc."</div>";
			$html .= "</div>";
		}
		exit($html);
	}
	
	
	// 目的：批量 修改sku状态
	public function upSkuStatus( Request $request )
	{
		// 获取sku 和 状态
		$data = $request -> only('all','status');
		// 允许的状态
		$allow = array( '上架'=>1,'热卖'=>2,'新品'=>3,'已下架'=>4,'售罄'=>5 );
		if( !in_array($data['status'],$allow) )
		{
			$this -> ajAxReturn('状态码错误');
		}
		$status = array( 1=>'上架',2=>'热卖',3=>'新品',4=>'已下架',5=>'售罄' );
		// 清除无效值
		unset($data['all'][0]);	
		
		switch( $data['status'] )
		{
			case '5':
				// 设置为已售罄
				$need = array( 
					// 是否售罄 1否 2售罄
					'is_sold_out'=>2
				);
			break;
			default:
				// 设置状态
				$need = array( 
					'status'=>$data['status'],
					// 未售罄
					'is_sold_out'=>1
				);
			break;
		}
		foreach( $data['all'] as $key => $sku )
		{
			// 挨个 修改状态
			$final = DB::table('sku')
				-> where( 'id',$sku )
				-> update( $need );
			$sku_log = array(
				'sku' => $sku,
				'admin_id'=>Session::get('admin_id'),
				'desc'=>' 修改 sku=>'.$sku.' 状态=>'.$status[$data['status']],
				'log_at'=>date( 'Y-m-d H:i:s',time() )
			);
			// 日志
			DB::table('sku_log')->insertGetId( $sku_log );
		}
		
		$this -> ajAxReturn('设置 '.$status[$data['status']].' 成功' );
		
	}
	
	
	// 商品 补充库存（待开发）
	public function addStock( $com_id,Request $request )
	{
		$final = array();
		// 接收 补充库存
		$data = $request -> except('_token');
		// 1. 获取商品 剩余库存 与 累积库存
		$com_info = DB::table('com')
						->select('stock','allStock')
						->where('id',$com_id)
						->first();
		// 原本的 剩余库存
		$final['stock'] = $com_info->stock ;
		// 追加后 剩余库存
		$final['stock'] += $data['stock'] ;
		if( $final['stock'] > 0 )
		{
			// 上架
			$final['status'] = 1;
		}else
		{
			// 无库存
			$final['status'] = 4;
		}
		
		// 累积库存
		$final['allStock'] = $com_info->allStock;
		$final['allStock'] += $data['stock'] ;
		
		
		// 2. 执行 补充库存
        $res = DB::table('com')
						->where( 'id',$com_id )
						->update( $final );
		if($res)
		{
			/*
			* 	写日志 
			* 	参数：$type		类型 1是前台用户 2是商品 3是订单 4是员工管理
			*		  $link_id	关联表的ID
			*		  $content	操作说明
			*/
			$this -> write_log(2,$com_id,"商品[".$com_id."]增加库存".$data['stock']."件 剩余库存".$final['stock']."件");
			return 1;
		}else
		{
			return 0;
		}
	}
	
	
	
	
	
	
}
